import Client from './common'
import {axiosPost} from '../api'
import { Toast } from 'mint-ui';
let listen = {
  onFriendAddNotify: {},
  onPendencyAddNotify: {},//好友系统通知事件
  onPendencyDeleteNotify: {},
  onApplyJoinGroupRequestNotify: [],//申请加群请求（只有管理员会收到）
  onApplyJoinGroupAcceptNotify: {},//申请加群被同意（只有申请人能够收到）
  onApplyJoinGroupRefuseNotify: {}, //申请加群被拒绝（只有申请人能够收到）
  onKickedGroupNotify: {}, //被管理员踢出群(只有被踢者接收到)
  onDestoryGroupNotify: {}, //群被解散(全员接收)
  onCreateGroupNotify: {}, //创建群(创建者接收)
  onInvitedJoinGroupNotify: {}, //邀请加群(被邀请者接收)
  onQuitGroupNotify: {}, //主动退群(主动退出者接收)
  onSetedGroupAdminNotify: {}, //设置管理员(被设置者接收)
  onCanceledGroupAdminNotify: {}, //取消管理员(被取消者接收)
  onRevokeGroupNotify: {}, //群已被回收(全员接收)
  onMsgNotify: null,//监听新消息
  onConnNotify: null, //监听连接状态
  onProfileModifyNotify: null, // 资料变换
  
};
//公用登陆
function login(callback) {
  //登录前数据请求
  let urlSrting = new Client.getQueryString();
  let AppId = urlSrting.appid,
      OpenId = urlSrting.openid;
  let checkLogin;
  if (!AppId && !OpenId) {
    if (localStorage.userLogin) {
      checkLogin = Client.getStore('userLogin');
    } else {
      Toast('应用ID不能为空');
      return;
    }
  } else {
    checkLogin = {
      AppId: AppId,//"123456789",//必传 地址栏参数
      OpenId: OpenId//"QWERTYUIO"//必传 地址栏参数
      //"Identifier":"1234567890",
      //"UserType": 0
    };
    Client.setStore('userLogin', checkLogin);
  }
  axiosPost({
    data: checkLogin,
    url: 'UserInfo/UserLoginInformation?token=79864&appsecret=wwwww',
    onSuccess (res) {
      let data = res.data,
          resultData = data.Result,
          userMsg = resultData.UserSig;
      //当前用户身份
      let loginInfo = {
          sdkAppID: resultData.SdkAppId,//用户所属应用id,必填
          identifier: userMsg.Identifier,//当前用户ID,必须是否字符串类型，必填
          accountType: resultData.accountType,//用户所属应用帐号类型，必填
          userSig: userMsg.sig,//当前用户身份凭证，必须是字符串类型，必填
          headurl: ""
      };
      //临时本地测试
      /*let loginInfo = {
       sdkAppID: '1400047124',
       identifier: '68b01fbc186553e4',
       accountType: '18646',
       userSig: 'eJxlj0FPgzAAhe-8CsJ1RlpKCzHxgDJ0OEh0W*K4EEaLVFxhpTg243934hIxvuv35b28D03XdWM5X1xmeV53QqXq0DBDv9INYFz8wqbhNM1UiiT9B1nfcMnSrFBMDhBijC0Axg6nTChe8LNB3A2AxSaHLsEYMXtktrRKh7mfKvvUYzvQ*qPwlwFG09XtLJhEnbNiiNwndI8KM7zrj2YX7Py5kEUfx9SftCFW5Pj45PGpZ27LdfUaRh4sZectgvYmhm87XPvrZC*YE1WHZLZ8eCZBaV*PJhXfsvM3CFzXIS4a0XcmW16LQbDASbEQ*I6hfWpfUiFfGg__',
       headurl: ""
       };*/
       function onFriendAddNotify(notify) {
          //webim.Log.info("执行 好友表添加 回调："+JSON.stringify(notify));
          //好友表发生变化，需要重新加载好友列表或者单独添加notify.Accounts好友帐号
          //var content = "新增以下好友："+notify.Accounts;
          listen.onFriendAddNotify = notify;
          console.log('已添加好友消息',notify);
      }
      function onPendencyAddNotify(notify) {
        console.log('好友回调', notify);
        listen.onPendencyAddNotify = notify;
      } 
      function onPendencyDeleteNotify(notify) {
        //webim.Log.info("执行 未决删除 回调："+JSON.stringify(notify));
        listen.onPendencyDeleteNotify = notify;
      }
      //未决增加
      //监听好友系统通知函数对象
      let onFriendSystemNotifys = {
        "1": onFriendAddNotify, //好友表增加
        //"2": onFriendDeleteNotify, //好友表删除
        "3": onPendencyAddNotify, //未决添加
        "4": onPendencyDeleteNotify, //未决删除
        //"5": onBlackListAddNotify, //黑名单增加
        //"6": onBlackListDeleteNotify //黑名单删除
      };


      function onMsgNotify(newMsgList) {
        //console.log('newMsgList',newMsgList);
        console.log('commonYES');
        let sess, newMsg;
        //获取所有聊天会话
        let sessMap = webim.MsgStore.sessMap();
        for (let j in newMsgList) {//遍历新消息
          newMsg = newMsgList[j];
        }
        listen.onMsgNotify = newMsg;
      }

      let onProfileSystemNotifys = {
        "1": onProfileModifyNotify//资料修改
      };
      //监听资料系统通知函数对象
      function onProfileModifyNotify(notify) {
        webim.Log.info("执行 资料修改 回调：" + JSON.stringify(notify));
        let typeCh = "[资料修改]";
        let profile, account, nick, sex, allowType, content, image;
        account = notify.Profile_Account;
        content = "帐号：" + account + ", ";
        for (var i in notify.ProfileList) {
          profile = notify.ProfileList[i];
          console.log('tag', profile.Tag);
          switch (profile.Tag) {
            case 'Tag_Profile_IM_Nick':
              nick = profile.ValueBytes;
              break;
            case 'Tag_Profile_IM_Gender':
              sex = profile.ValueBytes;
              break;
            case 'Tag_Profile_IM_AllowType':
              allowType = profile.ValueBytes;
              break;
            case 'Tag_Profile_IM_Image':
              image = profile.ValueBytes;
              break;
            default:
              webim.log.error('未知资料字段：' + JSON.stringify(profile));
              break;
          }
        }
        
        //content += "最新资料：【昵称】：" + nick + ",【性别】：" + sex + ",【加好友方式】：" + allowType + ",【头像】：" + image;
        content = {
          'nick':nick,
          'sex':sex,
          'allowType':allowType,
          'image':image
        }
        listen.onProfileModifyNotify = content;
        //addProfileSystemMsg(notify.Type, typeCh, content);

        /*if(account!=loginInfo.identifier){//如果是好友资料更新
         //好友资料发生变化，需要重新加载好友列表或者单独更新account的资料信息
         getAllFriend(getAllFriendsCallbackOK);
         }*/
      }


      // 群组监听 start ------------------------------------------------------------------
      // --------------------------------------------------------------------------------
      // --------------------------------------------------------------------------------
      // --------------------------------------------------------------------------------


      //监听（多终端同步）群系统消息方法，方法都定义在receive_group_system_msg.js文件中
      //注意每个数字代表的含义，比如，
      //1表示监听申请加群消息，2表示监听申请加群被同意消息，3表示监听申请加群被拒绝消息
      let onGroupSystemNotifys = {
        "1": onApplyJoinGroupRequestNotify, //申请加群请求（只有管理员会收到）
        "2": onApplyJoinGroupAcceptNotify, //申请加群被同意（只有申请人能够收到）
        "3": onApplyJoinGroupRefuseNotify, //申请加群被拒绝（只有申请人能够收到）
        "4": onKickedGroupNotify, //被管理员踢出群(只有被踢者接收到)
        "5": onDestoryGroupNotify, //群被解散(全员接收)
        "6": onCreateGroupNotify, //创建群(创建者接收)
        "7": onInvitedJoinGroupNotify, //邀请加群(被邀请者接收)
        "8": onQuitGroupNotify, //主动退群(主动退出者接收)
        "9": onSetedGroupAdminNotify, //设置管理员(被设置者接收)
        "10": onCanceledGroupAdminNotify, //取消管理员(被取消者接收)
        "11": onRevokeGroupNotify, //群已被回收(全员接收)
        // "15": onReadedSyncGroupNotify, //群消息已读同步通知
        "255": onCustomGroupNotify, //用户自定义通知(默认全员接收)
        "12": onInvitedJoinGroupNotifyRequest//邀请加群(被邀请者接收,接收者需要同意)
      };


      // 加群申请
      function onApplyJoinGroupRequestNotify(notify) {
        let isExist = false;
        console.log(notify);
         let arr = listen.onApplyJoinGroupRequestNotify;
         if(arr.length <= 0) {
          arr.push(notify);
         }else {
          for( let attr in arr) {
            if(arr[attr].Operator_Account != notify.Operator_Account || arr[attr].GroupId == notify.GroupId) {
              isExist = true;
            }
          }
          if(!isExist){
            arr.push(notify);
          }
         }
        // listen.onApplyJoinGroupRequestNotify.push(notify);
        

         
        // listen.onApplyJoinGroupRequestNotify.push(notify);
        // webim.Log.info("执行 加群申请 回调：" + JSON.stringify(notify));
        // var data = [];
        // var timestamp = notify.MsgTime;
        // notify.MsgTimeStamp = timestamp;
        // notify.MsgTime = webim.Tool.formatTimeStamp(notify.MsgTime);
        // data.push(notify);
        // loginInfo.listeners = 222;
        // console.log("福州");
        // $('#get_apply_join_group_pendency_table').bootstrapTable('append', data);
        // $('#get_apply_join_group_pendency_dialog').modal('show');

        // var reportTypeCh = "[申请加群]";
        // var content = notify.Operator_Account + "申请加入你的群";
        // addGroupSystemMsg(notify.ReportType, reportTypeCh, notify.GroupId, notify.GroupName, content, timestamp);
      }

      //监听 申请加群被拒绝 系统消息
      function onApplyJoinGroupRefuseNotify(notify) {
        webim.Log.info("执行 申请加群被拒绝 回调：" + JSON.stringify(notify));
        let reportTypeCh = "[申请加群被拒绝]";
        let content = notify.Operator_Account + "拒绝了你的加群申请，附言：" + notify.RemarkInfo;
        let data = addGroupSystemMsg(notify.ReportType, reportTypeCh, notify.GroupId, notify.GroupName, content, notify.MsgTime);
        Client.log("被拒绝",data);
        listen.onApplyJoinGroupRefuseNotify=data;
      }

      //监听 申请加群被同意 系统消息
      function onApplyJoinGroupAcceptNotify(notify) {
        webim.Log.info("执行 申请加群被同意 回调：" + JSON.stringify(notify));
        let reportTypeCh = "[申请加群被同意]";
        let content = notify.Operator_Account + "同意你的加群申请，附言：" + notify.RemarkInfo;
        let data = addGroupSystemMsg(notify.ReportType, reportTypeCh, notify.GroupId, notify.GroupName, content, notify.MsgTime);
        Client.log("被同意",data);
        listen.onApplyJoinGroupAcceptNotify = data
      }

      //监听 被踢出群 系统消息
      function onKickedGroupNotify(notify) {
        webim.Log.info("执行 被踢出群  回调：" + JSON.stringify(notify));
        //刷新我的群组列表
        //getJoinedGroupListHigh(getGroupsCallbackOK);
        // deleteSessDiv(webim.SESSION_TYPE.GROUP,notify.GroupId);//在最近的联系人列表删除可能存在的群会话
        let reportTypeCh = "[被踢出群]";
        let content = "你被管理员" + notify.Operator_Account + "踢出该群";
        let data = addGroupSystemMsg(notify.ReportType, reportTypeCh, notify.GroupId, notify.GroupName, content, notify.MsgTime);
        Client.log("被踢出群",data);
        listen.onKickedGroupNotify = data
      }

      //监听 解散群 系统消息
      function onDestoryGroupNotify(notify) {
        webim.Log.info("执行 解散群 回调：" + JSON.stringify(notify));
        //刷新我的群组列表
        //getJoinedGroupListHigh(getGroupsCallbackOK);
        // deleteSessDiv(webim.SESSION_TYPE.GROUP,notify.GroupId);//在最近的联系人列表删除可能存在的群会话
        let reportTypeCh = "[群被解散]";
        let content = "群主" + notify.Operator_Account + "已解散该群";
        let data = addGroupSystemMsg(notify.ReportType, reportTypeCh, notify.GroupId, notify.GroupName, content, notify.MsgTime);
        Client.log("群被解散",data);
        listen.onDestoryGroupNotify=data;
      }

      //监听 创建群 系统消息
      function onCreateGroupNotify(notify) {
        webim.Log.info("执行 创建群 回调：" + JSON.stringify(notify));
        let reportTypeCh = "[创建群]";
        let content = "你创建了该群";
        let data = addGroupSystemMsg(notify.ReportType, reportTypeCh, notify.GroupId, notify.GroupName, content, notify.MsgTime);
        Client.log("你创建了该群",data);
        listen.onCreateGroupNotify=data;
      }

      //监听 被邀请加群 系统消息
      function onInvitedJoinGroupNotify(notify) {
        webim.Log.info("执行 被邀请加群  回调: " + JSON.stringify(notify));
        //刷新我的群组列表
        //getJoinedGroupListHigh(getGroupsCallbackOK);
        let reportTypeCh = "[被邀请加群]";
        let content = "你被管理员" + notify.Operator_Account + "邀请加入该群";
        let data = addGroupSystemMsg(notify.ReportType, reportTypeCh, notify.GroupId, notify.GroupName, content, notify.MsgTime);
        Client.log("被邀请加群",data);
        listen.onInvitedJoinGroupNotify=data;
      }

      //监听 主动退群 系统消息
      function onQuitGroupNotify(notify) {
        webim.Log.info("执行 主动退群  回调： " + JSON.stringify(notify));
        // deleteSessDiv(webim.SESSION_TYPE.GROUP,notify.GroupId);//在最近的联系人列表删除可能存在的群会话
        let reportTypeCh = "[主动退群]";
        let content = "你退出了该群";
        let data = addGroupSystemMsg(notify.ReportType, reportTypeCh, notify.GroupId, notify.GroupName, content, notify.MsgTime);
        Client.log("主动退群",data);
        listen.onQuitGroupNotify=data;
      }

      //监听 被设置为管理员 系统消息
      function onSetedGroupAdminNotify(notify) {
        webim.Log.info("执行 被设置为管理员  回调：" + JSON.stringify(notify));
        let reportTypeCh = "[被设置为管理员]";
        let content = "你被群主" + notify.Operator_Account + "设置为管理员";
        let data = addGroupSystemMsg(notify.ReportType, reportTypeCh, notify.GroupId, notify.GroupName, content, notify.MsgTime);
        Client.log("被设置为管理员",data);
        listen.onSetedGroupAdminNotify=data;
      }

      //监听 被取消管理员 系统消息
      function onCanceledGroupAdminNotify(notify) {
        webim.Log.info("执行 被取消管理员 回调：" + JSON.stringify(notify));
        let reportTypeCh = "[被取消管理员]";
        let content = "你被群主" + notify.Operator_Account + "取消了管理员资格";
        let data = addGroupSystemMsg(notify.ReportType, reportTypeCh, notify.GroupId, notify.GroupName, content, notify.MsgTime);
        Client.log("被取消管理员",data);
        listen.onCanceledGroupAdminNotify=data;
      }

      //监听 群被回收 系统消息
      function onRevokeGroupNotify(notify) {
        console.info("执行 群被回收 回调： %s", JSON.stringify(notify));
        //刷新我的群组列表
        // getJoinedGroupListHigh(getGroupsCallbackOK);
        let reportTypeCh = "[群被回收]";
        let content = "该群已被回收";
        let data = addGroupSystemMsg(notify.ReportType, reportTypeCh, notify.GroupId,
          notify.GroupName, content, notify.MsgTime);
          Client.log("该群已被回收",data);
        listen.onRevokeGroupNotify=data;
      }

      //监听 被邀请加群(用户需要同意) 系统消息
      function onInvitedJoinGroupNotifyRequest(notify) {
        let timestamp = notify.MsgTime;
        notify.MsgTimeStamp = timestamp;
        notify.MsgTime = webim.Tool.formatTimeStamp(notify.MsgTime);
        data.push(notify);
        // $('#get_apply_join_group_pendency_dialog').modal('show');
        let data = addGroupSystemMsg(notify.ReportType, reportTypeCh, notify.GroupId, notify.GroupName, content, timestamp);
        Client.log("被邀请加群(用户需要同意)");
        Client.log(data);
        Client.log("被邀请加群(用户需要同意)");
      }

      //监听 群资料变化 群提示消息
      function onGroupInfoChangeNotify(notify) {
        Client.log("群资料变化");
        webim.Log.info("执行 群资料变化 回调： " + JSON.stringify(notify));
        let groupId = notify.GroupId;
        let newFaceUrl = notify.GroupFaceUrl;//新群组图标, 为空，则表示没有变化
        let newName = notify.GroupName;//新群名称, 为空，则表示没有变化
        let newOwner = notify.OwnerAccount;//新的群主id, 为空，则表示没有变化
        let newNotification = notify.GroupNotification;//新的群公告, 为空，则表示没有变化
        let newIntroduction = notify.GroupIntroduction;//新的群简介, 为空，则表示没有变化
        Client.log("群资料变化");
        Client.log(11);
        Client.log("群资料变化");
        // if (newName) {
        //     updateSessNameDiv(webim.SESSION_TYPE.GROUP,groupId,newName);
        // }
        // if (newFaceUrl) {
        //     updateSessImageDiv(webim.SESSION_TYPE.GROUP,groupId,newFaceUrl);
        // }
      }

      //监听 用户自定义 群系统消息
      function onCustomGroupNotify(notify) {
        webim.Log.info("执行 用户自定义系统消息 回调：" + JSON.stringify(notify));
        var reportTypeCh = "[用户自定义系统消息]";
        var content = notify.UserDefinedField;//群自定义消息数据
        let data = addGroupSystemMsg(notify.ReportType, reportTypeCh, notify.GroupId, notify.GroupName, content, notify.MsgTime);
        Client.log("用户自定义系统消息");
        Client.log(data);
        Client.log("用户自定义系统消息");
      }

      //增加一条群组系统消息
      function addGroupSystemMsg(type, typeCh, group_id, group_name, msg_content, msg_time) {
        var data = [];
        data.push({
          "ReportType": type,
          "ReportTypeCh": typeCh,
          "GroupId": webim.Tool.formatText2Html(group_id),
          "GroupName": webim.Tool.formatText2Html(group_name),
          "MsgContent": webim.Tool.formatText2Html(msg_content),
          "MsgTime": webim.Tool.formatTimeStamp(msg_time)
        });
        return data;
        // $('#get_my_group_system_msgs_table').bootstrapTable('append', data);
        //$('#get_my_group_system_msgs_dialog').modal('show');
      }

      // 群组监听 end ------------------------------------------------------------------
      // --------------------------------------------------------------------------------
      // --------------------------------------------------------------------------------
      // --------------------------------------------------------------------------------

      //监听连接状态回调变化事件
      let onConnNotify = function (resp) {
      let info;
       switch (resp.ErrorCode) {
       case webim.CONNECTION_STATUS.ON:
       webim.Log.warn('建立连接成功: ' + resp.ErrorInfo);
       break;
       case webim.CONNECTION_STATUS.OFF:
       info = '连接已断开,请检查下你的网络是否正常';
       Toast(info);
       webim.Log.warn(info);
       break;
       case webim.CONNECTION_STATUS.RECONNECT:
       info = '连接状态恢复正常';
       Toast(info);
       webim.Log.warn(info);
       break;
       default:
       webim.Log.error('未知连接状态');
       break;
       }
       };
      //监听事件
      let listeners = {
        "onConnNotify": onConnNotify,//监听连接状态回调变化事件,必填

        "onMsgNotify": onMsgNotify,//监听新消息(私聊，普通群(非直播聊天室)消息，全员推送消息)事件，必填

        //"onBigGroupMsgNotify": onBigGroupMsgNotify,//监听新消息(直播聊天室)事件，直播场景下必填

        "onGroupSystemNotifys": onGroupSystemNotifys
        ,//监听（多终端同步）群系统消息事件，如果不需要监听，可不填

        "onGroupInfoChangeNotify": onGroupInfoChangeNotify,//监听群资料变化事件，选填

        "onFriendSystemNotifys": onFriendSystemNotifys, //监听好友系统通知事件，选填

        "onProfileSystemNotifys": onProfileSystemNotifys,//监听资料系统（自己或好友）通知事件，选填

        //"onKickedEventCall" : onKickedEventCall,//被其他登录实例踢下线

        //"onC2cEventNotifys": onC2cEventNotifys,//监听C2C系统消息通道
      };

      let options = {
        isAccessFormalEnv: true,
        isLogOn: false
      };
      webim.login(
          loginInfo,
          listeners,
          options,
          resp => {
            loginInfo.identifierNick = resp.identifierNick; //设置当前用户昵称
            loginInfo.headurl = resp.headurl; //设置当前用户头像
            listen = Object.assign(loginInfo, listen);
            Client.setStore('loginInfo',loginInfo);
            callback && callback(listen);
          },
          err => {
            Toast(err.ErrorInfo);
          }
      );
    },
    onFailure (res) {

    }
  })
}
//检查登录状态
export function checkStatus(callback){
  webim.getRecentContactList({
    'Count': 1
  },resp => {
     callback&&callback(listen);
  },resp => {
    if(resp.ErrorCode == -4){
      return login(callback);
    }else{
      console.log(resp)
    }
    //错误回调
  });
}
